#!/usr/pkg/bin/bash

# longitudes de archivos
LONG="0 1 2 3 6 9 50 51 255 256 511 512 4097 100000"

# modo debug
DEBUG=1
# se detiene si encuentra error
STOPONERROR=1

# separador largo
LONGSEP="_long sep_"

# make file always finish with new line
function NORMALIZE () {
	perl -pi -ne 'chomp; $_="$_\n"' $1;
}

function CONDEXIT () {
	echo ERROR: $1;
	if [ $STOPONERROR -ne 0 ]; then
		exit 1;
	fi
}

# pruebas de detección de error de IO
echo asdf > inf.bin
./tp1 -i inf.bin -o out.oct > /dev/null 2>&1
if [ $? -ne 0 ]; then
	CONDEXIT "prueba auxiliar"
fi
chmod a-r inf.bin
./tp1 -i inf.bin -o out.oct > /dev/null 2>&1
if [ $? -eq 0 ]; then
	CONDEXIT "tp1 no detecta error de IO en input file"
fi
chmod a+r inf.bin
chmod a-w out.oct
./tp1 -i inf.bin -o out.oct > /dev/null 2>&1
if [ $? -eq 0 ]; then
	CONDEXIT "tp1 no detecta error de IO en output"
fi
rm -f inf.bin
rm -f out.oct


#
# pruebas principales
#
for TAM in $LONG; do
	# setea longitud de linea tal que hay 4 lineas (salvo
	# para archivos chicos)
	let LEN=$TAM/4
	if [ $LEN -eq 0 ]; then
		LEN=$TAM
	fi
	if [ $TAM -eq 0 ]; then
		LEN=1; # caso TAM=0
	fi

	# genero random file
	echo Tamaño: $TAM
	if [ $TAM -ne 0 ]; then
		head -c $TAM /dev/urandom > inf.bin
	else
		echo -n > inf.bin
	fi	

#	# codifico a octal
	#od -An -b -w$LEN inf.bin | cut -c2- > outf-sep.oct
	./tp1 -d " " -l$LEN -i inf.bin -o outf-sep.oct
	NORMALIZE outf-sep.oct

	# genero archivo octal sin separador
	cat outf-sep.oct | tr -d " " > outf-nosep.oct
	NORMALIZE outf-nosep.oct

	# genero archivo sin saltos de linea
	cat outf-nosep.oct | tr -d "\n" > outf-nolines.oct
	NORMALIZE outf-nolines.oct;

	# genero archivo octal con separador multibyte
	cp -p outf-sep.oct outf-longsep.oct
	perl -pi -ne "s/ /$LONGSEP/g" outf-longsep.oct
	NORMALIZE outf-longsep.oct
	
	#
	# Pruebo tp1 propiamente dicho
	#

	if [ $DEBUG -eq 1 ]; then
		set -x
	fi
	
	#echo pruebo codif sin separador
	./tp1 -l $LEN -i inf.bin -o outf-nosep.oct.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba codif sin sep" 
	fi
	NORMALIZE outf-nosep.oct.tp1

	diff -q -B outf-nosep.oct.tp1 outf-nosep.oct || CONDEXIT "salida nosep"

	#echo pruebo codif con separador
	./tp1 -l $LEN -d " " -i inf.bin -o outf-sep.oct.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba codif con sep"
	fi
	NORMALIZE outf-sep.oct.tp1

	diff -q -B outf-sep.oct.tp1 outf-sep.oct || CONDEXIT "salida sep"

	#echo pruebo codif con separador largo
	./tp1 -l $LEN -d "$LONGSEP" -i inf.bin -o outf-longsep.oct.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba codif con sep largo"
	fi
	NORMALIZE outf-longsep.oct.tp1

	diff -q -B outf-longsep.oct.tp1 outf-longsep.oct || CONDEXIT "salida sep largo"

	#echo pruebo codif sin lineas
	./tp1 -i inf.bin -o outf-nolines.oct.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba codif sin lineas"
	fi
	NORMALIZE outf-nolines.oct.tp1

	diff -q -B outf-nolines.oct.tp1 outf-nolines.oct || CONDEXIT "salida nolines"

	#echo pruebo deco con sep
	./tp1 -b -d " " -i outf-sep.oct -o bin-sep.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba deco con sep"
	fi

	diff -q bin-sep.tp1 inf.bin || CONDEXIT "salida deco con sep"

	#echo pruebo deco sin sep
	./tp1 -b -i outf-nosep.oct -o bin-nosep.tp1
	if [ $? -ne 0 ]; then
		echo tp1 exited with error
		CONDEXIT "prueba deco sin sep"
	fi

	diff -q bin-nosep.tp1 inf.bin || CONDEXIT "salida deco sin sep"

	#echo pruebo deco sin lineas
	./tp1 -b -i outf-nolines.oct -o bin-nolines.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba deco sin lineas"
	fi

	diff -q bin-nolines.tp1 inf.bin || CONDEXIT "salida deco sin lineas"

	#echo pruebo deco con separador largo
	./tp1 -b -d "$LONGSEP" -i outf-longsep.oct -o bin-longsep.tp1 > /dev/null
	if [ $? -ne 0 ]; then
		CONDEXIT "prueba deco con sep largo"
	fi

	diff -q bin-longsep.tp1 inf.bin || CONDEXIT "salida deco sep largo"

	#echo pruebo que con caracteres inesperados reporte error
	# (ej: decodifico con separador pero no lo indico)
	if [ $LEN -gt 1 ]; then
		# solo para cuando tengo al menos 1 sep
		./tp1 -b -i outf-sep.oct -o bin-roto.tp1 > /dev/null 2>&1
		if [ $? -eq 0 ]; then
			echo "Decoding does not detect extrange characters"
			CONDEXIT "prueba deco con caracteres inesperados"
		fi
	fi

	if [ $DEBUG -eq 1 ]; then
		set +x
	fi
done
